標題聽起來很厲害(?),不過今天只需要認識一個 Web API - Element.getBoundingClientRect()
~
此元素方法會回傳一個DOMRect
物件,物件中會包含選取元素的尺寸和坐標資訊,除了元素的高度和寬度以外,其他的屬性都會依據元素當下相對 viewport 的左上角計算距離
換句話說,當上下滾動頁面時,y / top
的距離會變動,左右滾動頁面時,x / left
的距離會變動
可以用codepen連結觀察看看
在有滾動頁面的情況下,要取得特定元素相對於文件(Document)左上角的位置時就需要加上滾動的距離,計算公式如下:
元素相對於文件的水平距離: x / left + window.scollX
元素相對於文件的垂直距離: y / top + window.scrollY
圖片來源:MDN
width
: 選取元素的寬度height
: 選取元素的高度x / left
: 元素左上角相對視窗的水平距離right
: 元素右下角相對視窗的距離y / top
: 元素左上角相對視窗的垂直距離<span>
並加入到頁面中const spotlight = document.createElement('span');
document.body.append(spotlight);
spotlight.classList.add('spotlight');
function highlightLink() {
const linkInfo = this.getBoundingClientRect();
// 位置校正
const coordinate = {
width: linkInfo.width,
height: linkInfo.height,
left: linkInfo.left + scrollX,
top: linkInfo.top + scrollY,
}
spotlight.style.width = `${coordinate.width}px`;
spotlight.style.height = `${coordinate.height}px`;
spotlight.style.transform = `translate(${coordinate.left}px, ${coordinate.top}px)`;
}
const links = document.querySelectorAll('a');
links.forEach(link => {
link.addEventListener('mouseenter', highlightLink);
})
參考資料: